home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 15 / CU Amiga Magazine's Super CD-ROM 15 (1997)(EMAP Images)(GB)[!][issue 1997-10].iso / CUCD / Graphics / Ghostscript / source / stdpre.h < prev    next >
C/C++ Source or Header  |  1997-02-21  |  13KB  |  369 lines

  1. /* Copyright (C) 1993, 1994, 1996, 1997 Aladdin Enterprises.  All rights reserved.
  2.   
  3.   This file is part of Aladdin Ghostscript.
  4.   
  5.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  9.   License (the "License") for full details.
  10.   
  11.   Every copy of Aladdin Ghostscript must include a copy of the License,
  12.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  13.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  14.   under certain conditions described in the License.  Among other things, the
  15.   License requires that the copyright notice and this notice be preserved on
  16.   all copies.
  17. */
  18.  
  19. /* stdpre.h */
  20. /* Standard definitions for Aladdin Enterprises code not needing arch.h */
  21.  
  22. #ifndef stdpre_INCLUDED
  23. #  define stdpre_INCLUDED
  24.  
  25. /*
  26.  * Here we deal with the vagaries of various C compilers.  We assume that:
  27.  *    ANSI-standard Unix compilers define __STDC__.
  28.  *    Borland Turbo C and Turbo C++ define __MSDOS__ and __TURBOC__.
  29.  *    Borland C++ defines __BORLANDC__, __MSDOS__, and __TURBOC__.
  30.  *    Microsoft C/C++ defines _MSC_VER and _MSDOS.
  31.  *    Watcom C defines __WATCOMC__ and MSDOS.
  32.  *
  33.  * We arrange to define __MSDOS__ on all the MS-DOS platforms.
  34.  */
  35. #if (defined(MSDOS) || defined(_MSDOS)) && !defined(__MSDOS__)
  36. #  define __MSDOS__
  37. #endif
  38. /*
  39.  * Also, not used much here, but used in other header files, we assume:
  40.  *    Unix System V environments define SYSV.
  41.  *    The SCO ODT compiler defines M_SYSV and M_SYS3.
  42.  *    VMS systems define VMS.
  43.  *    OSF/1 compilers define __osf__ or __OSF__.
  44.  *      (The VMS and OSF/1 C compilers handle prototypes and const,
  45.  *      but do not define __STDC__.)
  46.  *    bsd 4.2 or 4.3 systems define BSD4_2.
  47.  *    POSIX-compliant environments define _POSIX_SOURCE.
  48.  *    Motorola 88K BCS/OCS systems defined m88k.
  49.  *
  50.  * We make fairly heroic efforts to confine all uses of these flags to
  51.  * header files, and never to use them in code.
  52.  */
  53. #if defined(__osf__) && !defined(__OSF__)
  54. #  define __OSF__ /* */
  55. #endif
  56. #if defined(M_SYSV) && !defined(SYSV)
  57. #  define SYSV /* */
  58. #endif
  59. #if defined(M_SYS3) && !defined(__SVR3)
  60. #  define __SVR3 /* */
  61. #endif
  62.  
  63. #if defined(__STDC__) || defined(__MSDOS__) || defined(__convex__) || defined(VMS) || defined(__OSF__) || defined(__WIN32__) || defined(__IBMC__) || defined(M_UNIX) || defined(__GNUC__) || defined(__BORLANDC__)
  64. # if !(defined(M_XENIX) && !defined(__GNUC__)) /* SCO Xenix cc is broken */
  65. #  define __PROTOTYPES__ /* */
  66. # endif
  67. #endif
  68.  
  69. /* Define dummy values for __FILE__ and __LINE__ if the compiler */
  70. /* doesn't provide these.  Note that places that use __FILE__ */
  71. /* must check explicitly for a null pointer. */
  72. #ifndef __FILE__
  73. #  define __FILE__ NULL
  74. #endif
  75. #ifndef __LINE__
  76. #  define __LINE__ 0
  77. #endif
  78.  
  79. /* Disable 'const' and 'volatile' if the compiler can't handle them. */
  80. #ifndef __PROTOTYPES__
  81. #  undef const
  82. #  define const    /* */
  83. #  undef volatile
  84. #  define volatile /* */
  85. #endif
  86.  
  87. /*
  88.  * Some compilers give a warning if a function call that returns a value
  89.  * is used as a statement; a few compilers give an error for the construct
  90.  * (void)0, which is contrary to the ANSI standard.  Since we don't know of
  91.  * any compilers that do both, we define a macro here for discarding
  92.  * the value of an expression statement, which can be defined as either
  93.  * including or not including the cast.  (We don't conditionalize this here,
  94.  * because no commercial compiler gives the error on (void)0, although
  95.  * some give warnings.)
  96.  */
  97. #define discard(expr) ((void)(expr))
  98.  
  99. /*
  100.  * The SVR4.2 C compiler incorrectly considers the result of << and >>
  101.  * to be unsigned if the left operand is signed and the right operand is
  102.  * unsigned.  We believe this only causes trouble in Ghostscript code when
  103.  * the right operand is a sizeof(...), which is unsigned for this compiler.
  104.  * Therefore, we replace the relevant uses of sizeof with size_of:
  105.  */
  106. #define size_of(x) ((int)(sizeof(x)))
  107.  
  108. /*
  109.  * Disable MS-DOS specialized pointer types on non-MS-DOS systems.
  110.  * Watcom C defines near, far, and huge as macros, so we must undef them.
  111.  * far_data is used for static data that must get its own segment.
  112.  * This is supported in Borland C++, but none of the others.
  113.  */
  114. #undef far_data
  115. #if defined(__TURBOC__) && !defined(__WIN32__)
  116. #  ifdef __BORLANDC__
  117. #    define far_data far
  118. #  else
  119. #    define far_data /* */
  120. #  endif
  121. #else
  122. #  undef near
  123. #  define near /* */
  124. #  undef far
  125. #  define far /* */
  126. #  define far_data /* */
  127. #  undef huge
  128. #  define huge /* */
  129. #  define _cs /* */
  130. #  define _ds /* */
  131. /* _es is never safe to use */
  132. #  define _ss /* */
  133. #endif
  134.  
  135. /* Get the size of a statically declared array. */
  136. #define countof(a) (sizeof(a) / sizeof((a)[0]))
  137. #define count_of(a) (size_of(a) / size_of((a)[0]))
  138.  
  139. /*
  140.  * Get the offset of a structure member.  Amazingly enough, the simpler
  141.  * definition works on all compilers except for one broken MIPS compiler
  142.  * and the IBM RS/6000.  Unfortunately, because of these two compilers,
  143.  * we have to use the more complex definition.  Even more unfortunately,
  144.  * the more complex definition doesn't work on the Mac CodeWarrior compiler.
  145.  */
  146. #ifdef macintosh
  147. #define offset_of(type, memb)\
  148.  ((int) &((type *) 0)->memb)
  149. #else
  150. #define offset_of(type, memb)\
  151.  ((int) ( (char *)&((type *)0)->memb - (char *)((type *)0) ))
  152. #endif
  153.  
  154. /*
  155.  * Get the alignment of a pointer modulo a given power of 2.
  156.  * There is no portable way to do this, but the following definition
  157.  * works on all reasonable systems.
  158.  */
  159. #define alignment_mod(ptr, modu)\
  160.   ((uint)( ((const char *)(ptr) - (const char *)0) & ((modu) - 1) ))
  161.  
  162. /* Define short names for the unsigned types. */
  163. typedef unsigned char byte;
  164. typedef unsigned char uchar;
  165. typedef unsigned short ushort;
  166. typedef unsigned int uint;
  167. typedef unsigned long ulong;
  168.  
  169. /* Since sys/types.h often defines one or more of these (depending on */
  170. /* the platform), we have to take steps to prevent name clashes. */
  171. /*** NOTE: This requires that you include std.h *before* any other ***/
  172. /*** header file that includes sys/types.h. ***/
  173. #define bool bool_        /* (maybe not needed) */
  174. #define uchar uchar_
  175. #define uint uint_
  176. #define ushort ushort_
  177. #define ulong ulong_
  178. #include <sys/types.h>
  179. #undef bool
  180. #undef uchar
  181. #undef uint
  182. #undef ushort
  183. #undef ulong
  184.  
  185. /*
  186.  * Define a Boolean type.  Even though we would like it to be
  187.  * unsigned char, it pretty well has to be int, because
  188.  * that's what all the relational operators and && and || produce.
  189.  * We can't make it an enumerated type, because ints don't coerce
  190.  * freely to enums (although the opposite is true).
  191.  */
  192. typedef int bool;
  193. /*
  194.  * MetroWerks CodeWarrior predefines true and false, probably as 1 and 0.
  195.  * We need to cancel those definitions for our own code.
  196.  */
  197. #undef false
  198. #define false ((bool)0)
  199. #undef true
  200. #define true ((bool)1)
  201.  
  202. /*
  203.  * Compilers disagree as to whether macros used in macro arguments
  204.  * should be expanded at the time of the call, or at the time of
  205.  * final expansion.  Even authoritative documents disagree: the ANSI
  206.  * standard says the former, but Harbison and Steele's book says the latter.
  207.  * In order to work around this discrepancy, we have to do some very
  208.  * ugly things in a couple of places.  We mention it here because
  209.  * it might well trip up future developers.
  210.  */
  211.  
  212. /*
  213.  * Define the type to be used for ordering pointers (<, >=, etc.).
  214.  * The Borland and Microsoft large models only compare the offset part
  215.  * of segmented pointers.  Semantically, the right type to use for the
  216.  * comparison is char huge *, but we have no idea how expensive comparing
  217.  * such pointers is, and any type that compares all the bits of the pointer,
  218.  * gives the right result for pointers in the same segment, and keeps
  219.  * different segments disjoint will do.
  220.  */
  221. #if defined(__TURBOC__) || defined(_MSC_VER)
  222. typedef unsigned long ptr_ord_t;
  223. #else
  224. typedef const char *ptr_ord_t;
  225. #endif
  226. /* Define all the pointer comparison operations. */
  227. #define _ptr_cmp(p1, rel, p2)  ((ptr_ord_t)(p1) rel (ptr_ord_t)(p2))
  228. #define ptr_le(p1, p2) _ptr_cmp(p1, <=, p2)
  229. #define ptr_lt(p1, p2) _ptr_cmp(p1, <, p2)
  230. #define ptr_ge(p1, p2) _ptr_cmp(p1, >=, p2)
  231. #define ptr_gt(p1, p2) _ptr_cmp(p1, >, p2)
  232. #define ptr_between(ptr, lo, hi)\
  233.   (ptr_ge(ptr, lo) && ptr_lt(ptr, hi))
  234.  
  235. /* Define  min and max, but make sure to use the identical definition */
  236. /* to the one that all the compilers seem to have.... */
  237. #ifndef min
  238. #  define min(a, b) (((a) < (b)) ? (a) : (b))
  239. #endif
  240. #ifndef max
  241. #  define max(a, b) (((a) > (b)) ? (a) : (b))
  242. #endif
  243.  
  244. /* Define a standard way to round values to a (constant) modulus. */
  245. #define round_down(value, modulus)\
  246.   ( (modulus) & ((modulus) - 1) ?    /* not a power of 2 */\
  247.     (value) - (value) % (modulus) :\
  248.     (value) & -(modulus) )
  249. #define round_up(value, modulus)\
  250.   ( (modulus) & ((modulus) - 1) ?    /* not a power of 2 */\
  251.     ((value) + ((modulus) - 1)) / (modulus) * (modulus) :\
  252.     ((value) + ((modulus) - 1)) & -(modulus) )
  253.  
  254. /*
  255.  * In pre-ANSI C, float parameters get converted to double.
  256.  * However, if we pass a float to a function that has been declared
  257.  * with a prototype, and the parameter has been declared as float,
  258.  * the ANSI standard specifies that the parameter is left as float.
  259.  * To avoid problems caused by missing prototypes,
  260.  * we declare almost all float parameters as double.
  261.  */
  262. typedef double floatp;
  263.  
  264. /*
  265.  * Define a handy macro for a statement that does nothing.
  266.  * We can't just use an empty body, since this upsets some compilers.
  267.  * We can't use the obvious
  268.  *    if (0)
  269.  * since that could "capture" a following statement if used incorrectly.
  270.  */
  271. #ifndef DO_NOTHING
  272. #  define DO_NOTHING do {} while (0)
  273. #endif
  274.  
  275. /*
  276.  * For accountability, debugging, and error messages,
  277.  * we pass a client identification string to alloc and free,
  278.  * and possibly other places as well.
  279.  * Define the type for these strings.  Note that because of the _ds,
  280.  * we must coerce them explicitly when passing them to printf et al.
  281.  */
  282. typedef const char _ds *client_name_t;
  283. #define client_name_string(cname) ((const char *)(cname))
  284.  
  285. /*
  286.  * If we are debugging, make all static variables and procedures public
  287.  * so they get passed through the linker.
  288.  */
  289. #define public /* */
  290. /*
  291.  * We separate out the definition of private this way so that
  292.  * we can temporarily #undef it to handle the X Windows headers,
  293.  * which define a member named private.
  294.  */
  295. #ifdef NOPRIVATE
  296. # define private_ /* */
  297. #else
  298. # define private_ static
  299. #endif
  300. #define private private_
  301.  
  302. /*
  303.  * Macros for argument templates.  ANSI C has these, as does Turbo C,
  304.  * but older pcc-derived (K&R) Unix compilers don't.  The syntax is
  305.  *    resulttype func(Pn(arg1, ..., argn));
  306.  */
  307.  
  308. #ifdef __PROTOTYPES__
  309. # define P0() void
  310. # define P1(t1) t1
  311. # define P2(t1,t2) t1,t2
  312. # define P3(t1,t2,t3) t1,t2,t3
  313. # define P4(t1,t2,t3,t4) t1,t2,t3,t4
  314. # define P5(t1,t2,t3,t4,t5) t1,t2,t3,t4,t5
  315. # define P6(t1,t2,t3,t4,t5,t6) t1,t2,t3,t4,t5,t6
  316. # define P7(t1,t2,t3,t4,t5,t6,t7) t1,t2,t3,t4,t5,t6,t7
  317. # define P8(t1,t2,t3,t4,t5,t6,t7,t8) t1,t2,t3,t4,t5,t6,t7,t8
  318. # define P9(t1,t2,t3,t4,t5,t6,t7,t8,t9) t1,t2,t3,t4,t5,t6,t7,t8,t9
  319. # define P10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10
  320. # define P11(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11
  321. # define P12(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12
  322. # define P13(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13
  323. # define P14(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14
  324. # define P15(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15
  325. #else
  326. # define P0() /* */
  327. # define P1(t1)    /* */
  328. # define P2(t1,t2) /* */
  329. # define P3(t1,t2,t3) /* */
  330. # define P4(t1,t2,t3,t4) /* */
  331. # define P5(t1,t2,t3,t4,t5) /* */
  332. # define P6(t1,t2,t3,t4,t5,t6) /* */
  333. # define P7(t1,t2,t3,t4,t5,t6,t7) /* */
  334. # define P8(t1,t2,t3,t4,t5,t6,t7,t8) /* */
  335. # define P9(t1,t2,t3,t4,t5,t6,t7,t8,t9)    /* */
  336. # define P10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10) /* */
  337. # define P11(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11) /* */
  338. # define P12(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12) /* */
  339. # define P13(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13) /* */
  340. # define P14(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14) /* */
  341. # define P15(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15) /* */
  342. #endif
  343.  
  344. /* Define success and failure codes for 'exit'. */
  345. #ifdef VMS
  346. #  define exit_OK 1
  347. #  define exit_FAILED 18
  348. #else
  349. #  define exit_OK 0
  350. #  define exit_FAILED 1
  351. #endif
  352. /*
  353.  * Define the informational exit status.
  354.  * We need to distinguish information returns because under MS Windows,
  355.  * they must return like an error so that the text window stays on the
  356.  * screen, while on other platforms, they must return successfully.
  357.  * Note that we define both gs_exit_INFO (before platform-specific
  358.  * mapping of 0 to exit_OK and 1 to exit_FAILED) and exit_INFO.
  359.  */
  360. #if defined(_WINDOWS) || defined(_Windows)
  361. #  define exit_INFO exit_FAILED
  362. #  define gs_exit_INFO 1
  363. #else
  364. #  define exit_INFO exit_OK
  365. #  define gs_exit_INFO 0
  366. #endif
  367.  
  368. #endif                    /* stdpre_INCLUDED */
  369.